/**
 * 表单保单、回填数据
 *
 */
var Form = Event.extend({
    init : function($form, model, opts) {
        this._super();

        this.$form = $form;
        this.model = model || null;
        this.opts  = {
            showSuccessMsg : 0,    //是否显示操作成功的提示信息，1显示，0不显示
            finish         : null, //执行完成返回结果后的回调函数，传递到回调函数的值为执行返回的结果

            /**
             * 是否以ajax方式提交数据,如果不以ajax提交数据则直接使用form的行为
             * isAjax : 0时, showSuccessMsg、finish属性无效
             */
            isAjax : 1,
            method : 'post'    //表单提交方式
        };

        if (typeof(opts) == 'object' && opts !== null) {
            this.setOpts(opts);
        }

        this.initEvent();
        this.fill();
    }, 

    setOpts : function(k, v) {
        var dao   = (typeof(k) == 'object' && k !== null) ? k : {k : v},
            _this = this;

        $.each(dao, function(_k, _v) {
            if (typeof(_v) != 'undefined') {
                _this.opts[_k] = _v;

                if (_k == 'finish') {
                    _this.setFinish();  //激活finish事件
                }
            }
        })

        return true;
    },

    setFinish : function(fn) {
        if (typeof(fn) == 'function') {
            this.opts.finish = fn;
        }

        if (typeof(this.opts.finish) != 'function') {
            return false;
        }

        var _this = this;

        this.on('Form.finish', function(e, j) {
            _this.opts.finish.call(_this, e, j);
        })
    },

    initEvent : function() {
        var _this = this;

        var saveAction = function(e) {
            e.preventDefault();
            _this.save.call(_this);
        }

        this.$form.find('[type=submit]').click(saveAction);

        this.$form.find('[type=reset]').click(function() {
            _this.reset.call(_this);
        })

        this.setFinish();

        /**
         * 将与表单关联的所有 保存 按钮增加绑定事件
         * 表单关联保存按钮命名规则： 表单id-save-btn
         */
        if (this.$form.attr('id')) {
            var allSaveBtnKey = this.$form.attr('id') + '-save-btn',    //关联的保存按钮
                $allSaveBtn = $('[t=' + allSaveBtnKey + ']');

            $allSaveBtn.click(saveAction);
        }
    },

    setModel : function(model) {
        this.model = model;
    },

    /**
     * 复位表单，清空span[name]节点的值
     */
    reset : function() {
        this.$form[0].reset();
        this.fillSpan();
    },

    /**
     * 将dao中键名与span[name]属性相同的数据填充至span[name]中
     */
    fillSpan : function(model){
        m = model || this.model;

        this.$form.find('span[name]').each(function(){
            var name  = $(this).attr('name');

            $(this).html(m.get(name));
        });
    },

    /**
     * 填充数据至表单和文本节点
     * input:checkbox的选中值用数组的形式表述
     */
    fill : function(model) {
        m = model || this.model;

        if (m === null) {
            return true;
        }

        this.fillSpan(m);

        var _this = this;

        $.each(m.get(), function(k, v){
            if(typeof(v) == 'function') {
                return ;
            }

            var name = typeof(v) == 'object' && v != null ? k + '\\[\\]' : k,
                $o = _this.$form.find('[name='+ name + ']'),
                type = $o.length  ? $o[0].type : undefined,
                check = {checked : true};

            if(typeof(type) == 'undefined') {
                return;
            }

            switch(type) {
                case 'radio' :
                    $o.filter('[value=' + v + ']').attr(check);
                    break;

                case 'checkbox' :
                    if(typeof(v) == 'object') {
                        $.each(v, function(k2, v2){
                            if (v2) {
                                $o.filter('[value=' + v2 + ']').attr(check);
                            }
                        });
                    } else {
                        $o.filter('[value=' + v + ']').attr(check);
                    }
                    break;

                default : 
                    $o.val(v);
            }
        });
    },

    /**
     * 返回表单中数据，结果为json格式
     */
    getDao : function() {
        var dao = this.$form.serializeArray(),
            r = {};

        $.each(dao, function(k, v){
            if(typeof(v.value) != 'undefined') {
                var index = v.name.indexOf('['); //名字中包含有[表示数组 

                if(index != -1) {
                    var tmpName = v.name.substr(0, index);

                    if(typeof(r[tmpName]) == 'undefined') {
                        r[tmpName] = [];
                    }

                    r[tmpName].push(v.value);
                } else {
                    r[v.name] = v.value;
                }
            }
        });

        return r;
    },

    save : function() {
        var $form = this.$form,
            url   = $form.attr('action'),

            /**
             * <form>标签中增加go属性，此属性值可以网址、１、０，如果是网址则跳转到指定网址，1表示刷新当前页，0表示不刷新
             * 默认为1，提交后返回成功状态自动刷新当前页面
             */
            go    = $form.attr('go') || '1',
            d     = this.getDao(),
            _this = this,
            method = $form.attr('method') || this.opts.method;

        if (!this.isAjax) {
            if (method.toUpperCase() == 'GET') {
                var _d = $form.serialize();
                url = url + ((url.indexOf('?') != -1) ? '&' : '?') + _d;
                window.location.href = url;
            } else {
                $form[0].submit();
            }

            return true;
        }

        $[method](url, d, function(j) {
            if (!j.status) {
                
                alert(j.msg);
                
                return false;
            }

            var goVal = typeof(j.go) == 'undefined' ? go : j.go,
                goUrl;

            switch (goVal) {
                case '0' :
                    goUrl = '';
                    break;

                case '1' :
                    goUrl = window.location.href;
                    break;

                default :
                    goUrl = goVal;
            }

            if (typeof(_this.opts.finish) == 'function') {
                j.go = goUrl;

                _this.trigger('Form.finish', [j]);

                return true;
            }

            if (goUrl) {
                if (_this.opts.showSuccessMsg) {
                    $(_this.eventer).on('Form-save-finish-dialog-close', function() {
                        redirect(goUrl);
                    })
                } else {
                    redirect(goUrl);

                    return true;
                }
            }

            if (j.msg && _this.opts.showSuccessMsg) {
                var d = dialog({
                    title       : '提示',
                    content     : j.msg,
                    fixed       : true,
                    cancelValue : '关闭',
                    width       : 300,
                    cancel      : function() {
                        $(_this.eventer).trigger('Form-save-finish-dialog-close');
                    }
                })

                d.showModal();
            }
        }, 'json');
    }
});

